﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//atoi()函数
//原型：int atoi(const char*str);
//头文件：#include<stdlib.h>
/*功能：将字符串 str 转换为对应的十进制整数，转换规则如下：
 1. 跳过前导空白字符（如空格、制表符等）。
2. 处理符号：遇到 + 或 - 时，确定整数的正负（默认正）。
3. 读取数字字符：从第一个非空白、非符号的数字字符开始，直到遇到非数字字符或字符串结束。
4. 转换结束：非数字字符（如字母、符号）或字符串结尾 \0 会终止转换。
 示例
 -  atoi("123")  → 123
-  atoi("  -456abc")  → -456
-  atoi("789def")  → 789
-  atoi("abc123")  → 0（无有效数字）
 注意事项
 - 溢出处理：若转换结果超出 int 类型范围（如 2147483647 或 -2147483648 ），行为未定义（不同编译器可能返回最大值、最小值或错误）。
- 空指针或无效格式：传入 NULL 或无有效数字的字符串时，返回0。
- 替代方案：若需更安全的转换（处理溢出、指定基数等），可使用 strtol 、 strtoll 等函数。*/

int main()
{
	char buffer[256];
	fgets(buffer,sizeof(buffer), stdin);
	int ret = atoi(buffer);
	printf("%d\n", ret);
	return 0;
}

//strtol()函数
//原型：long strtol(const char*str,char**ptr,int base);
/*参数说明
1.  str ：待转换的字符串指针。
2.  ptr ：输出参数，指向转换结束位置的指针（若无需该信息，可传 NULL ）。
3.  base ：转换基数（进制），取值范围：
-  base = 10 ：十进制（类似 atoi ）。
-  base = 2-36 ：对应进制（如 base=16 表示十六进制）。
-  base = 0 ：自动识别进制（前缀 0 为八进制， 0x 为十六进制，否则十进制）。
 转换规则
 1. 跳过前导空白：同 atoi ，先跳过空格、制表符等。
2. 处理符号：可选 + 或 - ，确定正负。
3. 按基数读取数字：
- 十进制：仅允许 0-9 。
- 十六进制：允许 0-9 、 a-f （或 A-F ）。
- 其他进制：按基数范围读取有效数字（如八进制仅 0-7 ）。
4. 终止条件：遇到非数字字符、超出基数范围的字符，或字符串结束 \0 。
 返回值
 - 成功：返回转换后的长整型值（ long 类型）。
- 错误：
- 无有效数字时返回0。
- 溢出时返回 LONG_MAX （正溢出）或 LONG_MIN （负溢出），并设置 errno 为 ERANGE 。*/

//情形1
int main()
{
	char* str;
	long ret = strtol("26xyz", &str, 16);//将26转为16进制
	printf("%x\n", ret);//%x以十六进制的形式打印
	printf("%s\n", str);
	return 0;
}

//情形2
int main()
{
	long ret = strtol("58", NULL, 8);//将字符串转为8进制，但是8不属于0~7，则只转5；
	printf("%o\n", ret);
	return 0;
}

//情形3
int main()
{
	long ret = strtol("0x1A", NULL, 0);
	printf("%d\n", ret);
	printf("%x\n", ret);
	return 0;
}